package q209_minSubArrayLen;

public class Solution_1 {
    /*
    此题使用滑动窗口可以解决
    对于长度最小的 连续子数组 首先定义左右指针 随着右侧指针不停移动
    向curSum加入当前的值 当值超过target时 就记录当前窗口的大小
    然后左移左指针 如果仍然大于target 继续更新len
    直到小于target 就继续移动右指针 更新len

    需要注意的是：
    1 left要从-1开始 如果从0开始 出现整个数组加起来为target时 此时求出来len比实际答案小一
    2 需要设定一个flag 因为有可能出现整个数组加起来也小于target的情况 此时要判断是否进入过循环 如果flag仍为false 就返回0

     */
    public int minSubArrayLen(int target, int[] nums) {
        int l = -1, curSum = 0, len = nums.length;
        boolean flag = false;
        for (int r = 0; r < nums.length; r++) {
            curSum += nums[r];
            while (curSum >= target) {
                flag = true;
                len = Math.min(len, r - l);
                l++;
                curSum -= nums[l];
            }
        }

        return flag ? len : 0;
    }
}
